Tính năng Standard Portable Intermediate Representation

SPIR-V là ngôn ngữ trung gian cấp cao, được trao đổi dưới dạng nhị phân. Các hàm (functions) được biểu thị bằng đồ thị luồng điều khiển (control-flow graph) của các basic block, sử dụng biểu mẫu static single assignment (SSA). Cấu trúc dữ liệu giữ lại biểu diễn phân cấp mức độ cao. Nó không bị mất mát, không như mã byte trước đây hoặc các biểu diễn trung gian giống như máy ảo được sử dụng cho các shaders đồ họa. Điều này cho phép gần hơn với hiệu suất tối ưu trên các thiết bị mục tiêu.[11]

Khả năng mở rộng

SPIR-V có thể được mở rộng bằng cách viết các phần mở rộng (extensions) để thêm ngữ nghĩa hoặc bằng đặt trước một dãy số cho nhà cung cấp. Các nhà cung cấp có thể thêm ngữ nghĩa mong muốn vào SPIR-V một cách độc lập.[12] Thêm tập lệnh mở rộng bổ sung (extended instruction sets) có thể được cung cấp trong các thông số kỹ thuật riêng biệt. Nhiều bộ tập lệnh có thể được nhập mà không gặp vấn đề gì, vì lệnh mở rộng được sử dụng bằng cách chỉ định ID của tập lệnh và ID của lệnh trong tập lệnh.[12]

Shaders/Kernels (các chương trình GPU song song)

Trình tạo bóng đồ họa sử dụng luồng điều khiển có cấu trúc (structured control flow) trong SPIR-V để nêu cách tổ chức luồng điều khiển. Điều này giúp xác định sự phân kỳ và hội tụ lại của luồng điều khiển trên các môi trường thực thi song song.[13] Specialization (chuyên môn hóa) làm giảm số lượng biến thể của shaders cần được phân phối.[14]

Trình gỡ lỗi shaders bao gồm RenderDoc, SwiftShader và Amber.[15]

Xác minh

Đặc điểm kỹ thuật SPIR-V nêu rõ các quy tắc phải tuân theo để có mô-đun SPIR-V hợp lệ. Điều này cho xác minh ngoại tuyến. Trình điều khiển thiết bị không có nghĩa vụ phải xử lý các mô-đun SPIR-V không hợp lệ. Trong thử nghiệm, kiểm tra conformance test (sự phù hợp) rằng trình điều khiển hoạt động chính xác khi sử dụng SPIR-V hợp lệ, trong khi các validators (trình xác minh) xác minh rằng giao diện người dùng tạo ra SPIR-V đúng cách.

Liên kết

SPIR-V có thể thể hiện các lệnh gọi đến các hàm trong một đơn vị biên dịch (compilation unit) khác. Phiên bản tiêu chuẩn của SPIR-V sử dụng tính năng này cho các kernel tính toán OpenCL, nhưng không sử dụng cho các shader, mà các API đồ họa muốn được liên kết đầy đủ thành một mô-đun SPIR-V.[16] Có các phần mở rộng có sẵn để cho phép các công cụ tạm thời sử dụng các shader được liên kết một phần và cả các kernel.[17]

Khả năng

Mô-đun SPIR-V được sử dụng bởi API khách để hỗ trợ các tính năng của mô-đun đó, được phân loại thông qua các khả năng và được khai báo sớm trong mô-đun. Trình xác minh có thể xác minh rằng mô-đun chỉ sử dụng các khả năng được khai báo và API khách có thể từ chối các mô-đun khai báo các khả năng không được hỗ trợ.[18]

Tài liệu tham khảo

WikiPedia: Standard Portable Intermediate Representation https://appdevelopermagazine.com/2462/2015/3/4/Khr... https://github.com/KhronosGroup/SPIRV-Cross https://github.com/KhronosGroup/SPIRV-Guide/blob/m... https://books.google.com/books?id=edeuDwAAQBAJ&dq=... https://www.informit.com/articles/article.aspx?p=2... https://www.phoronix.com/scan.php?page=news_item&p... https://vulkan-tutorial.com/Drawing_a_triangle/Gra... https://www.saschawillems.de/creations/spirv-vs-ex... https://veldrid.dev/articles/specialization-consta... https://www.iwocl.org/wp-content/uploads/iwocl2017...